#include "BaseType.h"
#include "Tracer.h"

using namespace libemb;
/**
 * 装饰器模式：
 * 1.动态地给类增加功能
 * 2.不需要修改原有的类(包括基类和子类)
 * 适用场景：
 * 1.在不修改类的情况下给类扩展功能
 * 与代理模式的区别：
 * 1.装饰器需要从外部传进来一个对象，然后对这个对象进行装饰
 * 2.代理模式中被代理者是代理自己生成的对象，客户并不知道你使用了代理。
 **/

class XLog{
public:
    virtual void print(std::string out)=0;
};

class MyLog:public XLog{
DECL_CLASSNAME(MyLog)
public:
    void print(std::string out) override
    {
        TRACE_INFO_CLASS("%s",CSTR(out));
    }
};

//装饰器
class LogDecorator: public XLog{
DECL_CLASSNAME(LogDecorator)
public:
    LogDecorator(std::shared_ptr<MyLog> log):
    m_log(log)
    {
    }
    void print(std::string out) override
    {
        TRACE_INFO_CLASS(">--------------------<");
        m_log->print(out);
        TRACE_INFO_CLASS(">--------------------<");
    }
private:
    std::shared_ptr<XLog> m_log;
};

int main()
{
    Tracer::getInstance().setLevel(TRACE_LEVEL_DBG);
	Tracer::getInstance().addSink(std::make_shared<STDSink>()).start();

    auto log = std::make_shared<MyLog>();
    auto deco = std::make_shared<LogDecorator>(log);
    deco->print("this is a log.");
    return RC_OK;
}